// 统一封装接口方法
// 每个方法负责请求一个url地址
// 逻辑页面，导入这个接口方法，就能发请求
// 好处：请求url路径，可以在这里统一管理
import request from '@/utils/request.js'
import { getStorage } from '@/utils/storage'
// 既引入也向外按需导出，所以引入的方法（中转）
export * from '@/api/ArticleDetail'
// 登录注册
export const getLoginAPI = ({ mobile, code }) => request({
  url: '/v1_0/authorizations',
  method: 'POST',
  data: {
    mobile,
    code
  }
})
// 频道- 获取所有频道列表
export const getAllChannelsAPI = () => {
  return request({
    url: '/v1_0/channels',
    method: 'GET'
  })
}
// 频道 - 更新覆盖用户频道
export const updateChannelsListAPI = ({ channels }) => {
  return request({
    url: '/v1_0/user/channels',
    method: 'PUT',
    data: {
      channels // 用户已选整个频道数组
    }
  })
}
// 频道- 删除指定用户频道
export const removeChannelsAPI = ({ channelId }) => request({
  url: `/v1_0/user/channels/${channelId}`,
  method: 'DELETE'
})
// 频道- 获取用户的频道
export const getUserChannelsAPI = () => {
  return request({
    url: '/v1_0/user/channels'

  })
}

//  频道- 获取文章列表
export const getArticlesAPI = ({ channel_id, timestamp }) => {
  return request({
    url: '/v1_0/articles',

    params: { // 这里的参数，axios会帮你拼接到url? 后面（查询字符串）
      channel_id,
      timestamp
    }
  })
}

// 文章-反馈-对文章不感兴趣
export const dislikeArticleAPI = ({ artId }) => {
  return request({
    url: '/v1_0/article/dislikes',
    method: 'POST',
    data: {
      target: artId
    }
  })
}

// 文章-反馈-举报文章
export const reportsArticleAPI = ({ artId, type }) => {
  return request({
    url: '/v1_0/article/reports',
    method: 'POST',
    data: {
      target: artId,
      type: type,
      remark: '其他说明的的附件内容'
      // 如果想写其他问题的文字反馈，可以通过逻辑页面判断，如果点击是类型是0，其他内容反馈 就通过给弹窗来收集文字内容传参到这里
    }
  })
}
// 文章 - 获取文章详情
export const detailAPI = ({ artId }) => request({
  url: `/v1_0/articles/${artId}`
})
// 搜索 - 联想菜单
export const getSuggestionAPI = ({ keywords }) => request({
  url: '/v1_0/suggestion',
  params: {
    q: keywords
  }
})
// 搜索 - 搜索结果
export const getSearchResult = ({ page = 1, per_page = 10, q }) => request({
  url: '/v1_0/search',
  params: {
    page,
    per_page,
    q
  }
})

//  用户 - 获取用户个人资料(编辑资料页面使用)
export const userProfileAPI = () => request({
  url: 'v1_0/user/profile'
})
//  用户 - 获取用户自己信息
export const getUserInfoAPI = () => request({
  url: 'v1_0/user'
})
//  用户 - 编辑用户照片资料
export const updateUserPhotoAPI = (fd) => request({
  url: '/v1_0/user/photo',
  method: 'PATCH',
  // 请求体里 Content-Type 要的是form-data表单对象格式，
  // 如果你的请求体里直接是FormDate表单对象，你也不用自己添加
  // Content-Type,axios发现数据请求是表单对象,它不会转换成json字符串
  // 也不会带Content-Type:application/json, 而是交给浏览器,浏览器发现请求体是formDate会自己携带Content-Type:multipart/form-data
  data: fd
  // Content-Type:application/json  axios携带的, 前提:data请求体是对象 -> json字符串 -> 发给后台
  // Content-Type:multipart/form-data; 浏览器携带的, 前提:data请求体必须是FormDate类型对象
})
//  用户 - 编辑用户个人资料
export const updateUserProfileAPI = (dataObj) => {
  // 判断，有值才带参数名发给后台，无值参数名也不携带
  // 写法1：解构赋值，四个判断，往空对象上添加有值得加上去
  // 写法2：形参写obj，外面想传几个对象的键值对，就直接传入交给后台
  // 写法3:上面写法不够语义化,看不出obj里有什么
  const obj = {
    name: '',
    gender: 0,
    birthday: '',
    real_name: '',
    intro: ''
  }
  for (const prop in obj) { // for循环整个obj
    if (dataObj[prop] === undefined) { // 用key去和外面传入的参数对象进行匹配,如果没有找到(证明外面没有传这个键值对,删除这个键值对)
      delete obj[prop] // 移除undefined的键值对
    } else { // 如果使用了,就从外面对象取出对应的key值,保存到obj上
      obj[prop] = dataObj[prop]
    }
  }
  return request({
    url: '/v1_0/user/profile',
    method: 'PATCH', // 局部更新 PUT(全都更新)
    // 在axios中 data不会忽略null的那对keyvalue 依旧会发给后台，params遇到null值会忽略，并不携带此键值对发给后台
    data: obj
  })
}

// 刷新 用户 token
export const getNewToken = () => request({
  // 请求拦截器中统一携带的token的key，和这次携带的token的key名不一样，这次是refresh_token
  // 所以在axios请求拦截器中判断，就是为了这种情况准备
  url: '/v1_0/authorizations',
  method: 'PUT',
  headers: {
    Authorization: 'Bearer ' + getStorage('refresh_token')
  }
})
